﻿using System;
using System.Data;
using System.Data.Linq;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;
using System.Web.Services;


namespace Emporium_Web
{
    public partial class OrdenProduccionForm : System.Web.UI.Page
    {
        /// <summary>
        /// Es el código de Pedido de Compra
        /// </summary>
        private int OrdenProduccionId
        {
            get { return ViewState["OrdenProduccionId"] == null ? -1 : (int)ViewState["OrdenProduccionId"]; }
            set { ViewState["OrdenProduccionId"] = value; }
        }

        /// <summary>
        /// Contiene la operación que se realizará en el formulario
        /// </summary>
        private AccionesForm Operacion
        {
            get { return ViewState["Operation"] == null ? AccionesForm.Consultar : (AccionesForm)ViewState["Operation"]; }
            set { ViewState["Operation"] = value; }
        }

        /// <summary>
        /// Es el código del Detalle Seleccionado
        /// </summary>
        private int DetalleId
        {
            get { return Session["DetalleId"] == null ? -1 : (int)Session["DetalleId"]; }
            set { Session["DetalleId"] = value; }
        }

        /// <summary>
        /// Es el código del Estilo Seleccionado
        /// </summary>
        private int EstiloId
        {
            get { return Session["EstiloId"] == null ? -1 : (int)Session["EstiloId"]; }
            set { Session["EstiloId"] = value; }
        }

        /// <summary>
        /// Listado de Detalle.
        /// </summary>
        private List<PR_OrdenProduccionDetalle> DetalleTemp
        {
            get
            {
                return Session["DetalleTemp"] == null ? null : (List<PR_OrdenProduccionDetalle>)Session["DetalleTemp"];
            }
            set
            {
                Session["DetalleTemp"] = value;
            }
        }

        protected void Page_Init(object sender, EventArgs e)
        {

        }

        protected void Page_Load(object sender, EventArgs e)
        {
            warningMessage.Visible = false;
            errorMessage.Visible = false;

            try
            {
                if (!IsPostBack)
                {
                    errorMessage.Visible = false;

                    Master.ActualizaMenu(MenuPrincipal.Produccion, (int)MenuProduccion.OrdenProduccion);
                    Master.AgregarBreadcrumb("Orden de Producción", "#", true);
                    Master.AgregarBreadcrumb("Listado", "OrdenProduccionList.aspx", false);

                    int PedComId = 0;

                    if (Request.QueryString["OrdenProduccionId"] != null && Int32.TryParse(Request.QueryString["OrdenProduccionId"], out PedComId))
                    {
                        this.OrdenProduccionId = PedComId;
                    }
                    else
                    {
                        this.OrdenProduccionId = -1;
                    }

                    DetalleTemp = new List<PR_OrdenProduccionDetalle>();

                    EstablecerComportamiento();
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        /// <summary>
        /// Prepara el formulario para la operación que se haya elegido (Agregar, Modificar o Consultar)
        /// </summary>
        private void EstablecerComportamiento()
        {
            int accion = 0;

            if (Request.QueryString["Operacion"] != null && Int32.TryParse(Request.QueryString["Operacion"].ToString(), out accion))
            {
                switch (accion)
                {
                    case (int)AccionesForm.Consultar:
                        this.Operacion = AccionesForm.Consultar;
                        Master.AgregarBreadcrumb("Consultar", "#", false);
                        CargarOrdenProduccion();
                        DeshabilitarControles();
                        btnGrabar.Visible = false;
                        break;
                    case (int)AccionesForm.Modificar:
                        this.Operacion = AccionesForm.Modificar;
                        Master.AgregarBreadcrumb("Modificar", "#", false);
                        CargarOrdenProduccion();
                        break;
                    default:
                        this.Operacion = AccionesForm.Adicionar;
                        Master.AgregarBreadcrumb("Adicionar", "#", false);
                        txtFechaRegistro.Text = DateTime.Now.ToShortDateString();
                        CargarDetalles();
                        break;
                }
            }
        }

        private void CargarOrdenProduccion()
        {
            TablasDataContext database = new TablasDataContext();

            var ordenProd = database.PR_OrdenProduccion.FirstOrDefault(c => c.OrdPro_Id == this.OrdenProduccionId);
            var variante = database.DE_Variante.FirstOrDefault(c => c.Variante_Id == ordenProd.Variante_Id);

            txtCodigo.Text = (ordenProd.OrdPro_Id).ToString("00000");
            txtFechaRegistro.Text = ordenProd.OrdPro_FechaRegistro.Value.ToShortDateString();
            txtFechaObjectivo.Text = ordenProd.OrdPro_FechaObjetivo.Value.ToShortDateString();
            txtDescripcion.Text = ordenProd.OrdPro_Descripcion;
            txtEstado.Text = ordenProd.OrdPro_Estado == 'R' ? "REGISTRADO" : string.Empty;
            clienteSearch.CodigoSeleccionado = ordenProd.Cliente_Id;
            clienteSearch.NombreSeleccionado = ordenProd.TG_Cliente.Nombre;
            txtCodigoEstilo.Text = ordenProd.Estilo_Id.ToString("00000");
            txtCodigoVariante.Text = Convert.ToInt32(variante.Variante_Secuencia).ToString("000");

            this.EstiloId = ordenProd.Estilo_Id;
            estiloAdd.CodigoSeleccionado = ordenProd.Estilo_Id;
            varianteAdd.CodigoSeleccionado = ordenProd.Variante_Id;
            varianteAdd.Secuencia = Convert.ToInt32(variante.Variante_Secuencia);
            ListarDetalles();
            CargarDetalles();
        }

        private void DeshabilitarControles()
        {
            txtCodigo.Enabled = false;
            txtFechaObjectivo.Enabled = false;
            imgFechaObjectivo.Visible = false;
            txtDescripcion.Enabled = false;
            clienteSearch.Enabled = false;

            btnBuscarEstilo.Visible = false;
            btnBuscarVariante.Visible = false;
            btnDetalleOrdenAdicionar.Visible = false;
            btnDetalleOrdenEliminar.Visible = false;
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                Grabar();
            }
            catch (Exception ex)
            {
                lblErrorMessage.Text = ex.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("OrdenProduccionList.aspx");
        }

        private void Grabar()
        {
            switch (this.Operacion)
            {
                case AccionesForm.Adicionar:
                    Insertar();
                    break;
                case AccionesForm.Modificar:
                    Actualizar();
                    break;
                default:
                    lblErrorMessage.Text = Resources.MensajesValidacion.InvalidOperation;
                    errorMessage.Visible = true;
                    break;
            }
        }

        private void Insertar()
        {
            try
            {
                string strResultado = ValidaDatos();
                if (strResultado != string.Empty)
                {
                    lblWarningMessage.Text = strResultado;
                    warningMessage.Visible = true;
                    return;
                }

                TablasDataContext database = new TablasDataContext();

                //Cargar Cabecera.
                PR_OrdenProduccion orden = new PR_OrdenProduccion();
                orden.OrdPro_Descripcion = txtDescripcion.Text;
                orden.Cliente_Id = clienteSearch.CodigoSeleccionado;
                orden.OrdPro_Estado = 'R';
                orden.OrdPro_FechaObjetivo = Convert.ToDateTime(txtFechaObjectivo.Text);
                orden.OrdPro_FechaRegistro = DateTime.Now.Date;
                orden.Estilo_Id = estiloAdd.CodigoSeleccionado;
                orden.Variante_Id = varianteAdd.CodigoSeleccionado;


                orden.PR_OrdenProduccionDetalle = new EntitySet<PR_OrdenProduccionDetalle>();

                //Se carga el detalle.
                foreach (var detalle in DetalleTemp)
                {
                    PR_OrdenProduccionDetalle nuevoDetalle = new PR_OrdenProduccionDetalle()
                    {
                        OrdProDet_CantidadProducida = detalle.OrdProDet_CantidadProducida,
                        OrdProDet_CantidadSolicitada = detalle.OrdProDet_CantidadSolicitada,
                        OrdProDet_Color = detalle.OrdProDet_Color,
                        OrdProDet_Secuencia = detalle.OrdProDet_Secuencia,
                        OrdProDet_Talla = detalle.OrdProDet_Talla,
                        PedCol_Id = detalle.PedCol_Id,
                        PedCom_Id = detalle.PedCom_Id,
                        Talla_Id = detalle.Talla_Id
                    };
                    orden.PR_OrdenProduccionDetalle.Add(nuevoDetalle);
                }

                database.PR_OrdenProduccion.InsertOnSubmit(orden);
                database.SubmitChanges();
                Response.Redirect("OrdenProduccionList.aspx");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void Actualizar()
        {
            try
            {
                string strResultado = ValidaDatos();
                if (strResultado != string.Empty)
                {
                    lblWarningMessage.Text = strResultado;
                    warningMessage.Visible = true;
                    return;
                }

                TablasDataContext database = new TablasDataContext();
                database.DeferredLoadingEnabled = false;

                //Cargar Cabecera.
                PR_OrdenProduccion orden = database.PR_OrdenProduccion.FirstOrDefault(c => c.OrdPro_Id == this.OrdenProduccionId);

                orden.OrdPro_Descripcion = txtDescripcion.Text;
                orden.Cliente_Id = clienteSearch.CodigoSeleccionado;
                orden.OrdPro_Estado = 'R';
                orden.OrdPro_FechaObjetivo = Convert.ToDateTime(txtFechaObjectivo.Text);
                orden.OrdPro_FechaRegistro = DateTime.Now.Date;
                orden.Estilo_Id = estiloAdd.CodigoSeleccionado;
                orden.Variante_Id = varianteAdd.CodigoSeleccionado;

                orden.PR_OrdenProduccionDetalle = new EntitySet<PR_OrdenProduccionDetalle>();

                //Se elimina el anterior detalle
                var detalles = (from detalleOrden in database.PR_OrdenProduccionDetalle
                                where detalleOrden.OrdPro_Id == this.OrdenProduccionId
                                select detalleOrden);

                foreach (var item in detalles)
                {
                    database.PR_OrdenProduccionDetalle.DeleteOnSubmit(item);
                }

                //Se carga el detalle.
                foreach (var detalle in DetalleTemp)
                {
                    PR_OrdenProduccionDetalle nuevoDetalle = new PR_OrdenProduccionDetalle()
                    {
                        OrdProDet_CantidadProducida = detalle.OrdProDet_CantidadProducida,
                        OrdProDet_CantidadSolicitada = detalle.OrdProDet_CantidadSolicitada,
                        OrdProDet_Color = detalle.OrdProDet_Color,
                        OrdProDet_Secuencia = detalle.OrdProDet_Secuencia,
                        OrdProDet_Talla = detalle.OrdProDet_Talla,
                        PedCol_Id = detalle.PedCol_Id,
                        PedCom_Id = detalle.PedCom_Id,
                        Talla_Id = detalle.Talla_Id
                    };
                    orden.PR_OrdenProduccionDetalle.Add(nuevoDetalle);
                }

                database.SubmitChanges();
                Response.Redirect("OrdenProduccionList.aspx");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private string ValidaDatos()
        {
            if (DetalleTemp.Count == 0)
            {
                return "No existen Detalles ingresadas.";
            }

            foreach (var detalle in DetalleTemp)
            {
                if (detalle.OrdProDet_CantidadProducida == null)
                {
                    return "Etiqueta[" + detalle.OrdProDet_Color + "] - Talla[" + detalle.OrdProDet_Talla + "] no tiene Cantidad Producida ingresado.";
                }
                if (detalle.OrdProDet_CantidadSolicitada == null)
                {
                    return "Etiqueta[" + detalle.OrdProDet_Color + "] - Talla[" + detalle.OrdProDet_Talla + "] no tiene Cantidad Solicitada ingresado.";
                }

                if (detalle.OrdProDet_CantidadSolicitada > detalle.OrdProDet_CantidadProducida)
                {
                    return "Etiqueta[" + detalle.OrdProDet_Color + "] - Talla[" + detalle.OrdProDet_Talla + "] Cantidad Solicitada es mayor a la Producida.";
                }
                if (detalle.OrdProDet_CantidadSolicitada * 1.1 < detalle.OrdProDet_CantidadProducida)
                {
                    return "Etiqueta[" + detalle.OrdProDet_Color + "] - Talla[" + detalle.OrdProDet_Talla + "] Cantidad Producida excede en 10% mas de la Cantidad Solicitada.";
                }
            }

            return string.Empty;
        }

        protected void gvDetalleOrden_RowDataBound(object sender, GridViewRowEventArgs e)
        {

        }

        protected void gvDetalleOrden_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.DetalleId = (int)gvDetalleOrden.DataKeys[gvDetalleOrden.SelectedIndex]["OrdProDet_Id"];
            ActualizarSeleccionGrilla(gvDetalleOrden);
        }

        private void ActualizarSeleccionGrilla(GridView gv)
        {
            if (gv.SelectedIndex > -1)
                foreach (GridViewRow row in gv.Rows)
                {
                    if (row.Cells[0].Controls.Count > 0)
                    {
                        ImageButton img = (ImageButton)row.Cells[0].Controls[0];
                        if ((row.RowIndex == gv.SelectedIndex))
                        {
                            img.ImageUrl = @"~/images/selected.png";
                        }
                        else
                        {
                            img.ImageUrl = @"~/images/unselected.png";
                        }
                    }
                }
        }

        protected void btnDetalleOrdenAdicionar_Click(object sender, EventArgs e)
        {
            if (this.EstiloId <= 0)
            {
                warningMessage.Visible = true;
                lblWarningMessage.Text = "Seleccione un Estilo";
                return;
            }
            pedidoCompraEstiloAdd.EstiloId = estiloAdd.CodigoSeleccionado;
            this.EstiloId = estiloAdd.CodigoSeleccionado;
            pedidoCompraEstiloAdd.ListarPedidoCompras();
        }

        protected void btnDetalleOrdenEliminar_Click(object sender, EventArgs e)
        {
            if (gvDetalleOrden.SelectedIndex > -1)
            {
                int CodigoPedido = (int)gvDetalleOrden.DataKeys[gvDetalleOrden.SelectedIndex]["PedCom_Id"];
                DetalleTemp.RemoveAll(c => c.PedCom_Id == CodigoPedido);
                CargarDetalles();
            }
            else
            {
                warningMessage.Visible = true;
                lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
            }
        }


        protected void agregarDetalle_Click(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            var lstEtiquetaTallas = from etiquetaTallas in database.CO_PedidoTalla
                                    where etiquetaTallas.Estilo_Id == this.EstiloId
                                    && etiquetaTallas.CO_PedidoColor.PedCom_Id == pedidoCompraEstiloAdd.CodigoSeleccionado
                                    select etiquetaTallas;

            foreach (var item in lstEtiquetaTallas)
            {
                if (!DetalleTemp.Exists(c => c.PedCol_Id == item.PedCol_Id && c.Talla_Id == item.Talla_Id))
                {
                    PR_OrdenProduccionDetalle detalle = new PR_OrdenProduccionDetalle()
                    {
                        OrdProDet_Secuencia = DetalleTemp.Count + 1,
                        OrdProDet_Color = item.CO_PedidoColor.TG_Combinacion.Combinacion_Descripcion,
                        OrdProDet_Talla = item.TG_Talla.Talla_DescripcionCorta,
                        PedCom_Id = item.CO_PedidoColor.PedCom_Id,
                        PedCol_Id = item.PedCol_Id,
                        Talla_Id = item.Talla_Id,
                        OrdProDet_CantidadSolicitada = item.PedTal_CantidadSolicitada,
                        OrdProDet_CantidadProducida = item.PedTal_CantidadProducida
                    };

                    DetalleTemp.Add(detalle);
                    if (DetalleTemp.Count() == 1) this.DetalleId = Convert.ToInt32(DetalleTemp[0].OrdProDet_Secuencia);
                }
            }
            CargarDetalles();
        }

        private void ListarDetalles()
        {
            TablasDataContext database = new TablasDataContext();

            var listaDetalle = from detalles in database.PR_OrdenProduccionDetalle
                               where detalles.OrdPro_Id == this.OrdenProduccionId
                               select detalles;

            DetalleTemp = listaDetalle.ToList();
        }

        private void CargarDetalles()
        {
            if (DetalleTemp.Count() > 0)
            {
                gvDetalleOrden.DataSource = DetalleTemp;
                gvDetalleOrden.DataBind();
                if (this.DetalleId > 0)
                    gvDetalleOrden.SelectedIndex = DetalleTemp.IndexOf(DetalleTemp.Find(c => c.OrdProDet_Secuencia == this.DetalleId));
                else
                    gvDetalleOrden.SelectedIndex = 0;
                ActualizarSeleccionGrilla(gvDetalleOrden);
            }
            else
            {
                gvDetalleOrden.DataSource = new List<PR_OrdenProduccionDetalle>() { new PR_OrdenProduccionDetalle() };
                gvDetalleOrden.DataBind();
                gvDetalleOrden.SelectedIndex = -1;
                for (int i = 0; i < gvDetalleOrden.Rows[0].Cells.Count; i++)
                {
                    gvDetalleOrden.Rows[0].Cells[i].Text = "&nbsp;";
                }
            }
        }


        protected void btnBuscarEstilo_Click(object sender, EventArgs e)
        {
            estiloAdd.ListarEstilos();
        }

        protected void estiloAdd_Seleccionado(object sender, EventArgs e)
        {
            txtCodigoEstilo.Text = estiloAdd.CodigoSeleccionado.ToString("00000");
            if (this.EstiloId != estiloAdd.CodigoSeleccionado)
            {
                this.EstiloId = estiloAdd.CodigoSeleccionado;
                DetalleTemp = new List<PR_OrdenProduccionDetalle>();
                CargarDetalles();
            }
        }

        protected void btnBuscarVariante_Click(object sender, EventArgs e)
        {
            varianteAdd.EstiloId = this.EstiloId;
            varianteAdd.ListarVariantes();
        }

        protected void varianteAdd_Seleccionado(object sender, EventArgs e)
        {
            txtCodigoVariante.Text = varianteAdd.Secuencia.ToString("000");
        }

        [WebMethod]
        public static void actualizarCantidadSolicitado(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                OrdenProduccionForm pagina = new OrdenProduccionForm();
                var detalles = (List<Emporium_Web.DBML.PR_OrdenProduccionDetalle>)pagina.Session["DetalleTemp"];

                var detalle = detalles.Find(c => c.OrdProDet_Secuencia == id);
                if (detalle != null)
                    detalle.OrdProDet_CantidadSolicitada = Convert.ToInt32(cantidad);
            }
        }

        [WebMethod]
        public static void actualizarCantidadProducido(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                OrdenProduccionForm pagina = new OrdenProduccionForm();
                var detalles = (List<Emporium_Web.DBML.PR_OrdenProduccionDetalle>)pagina.Session["DetalleTemp"];

                var detalle = detalles.Find(c => c.OrdProDet_Secuencia == id);
                if (detalle != null)
                    detalle.OrdProDet_CantidadProducida = Convert.ToInt32(cantidad);
            }
        }
    }
}